﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Zadani09.db.DAO;
using System.ComponentModel;
using System.Collections.Generic;

namespace Zadani09.db.ODS
{
      // comparer uzivatelu
    public class uzivatel_comparer : IComparer<t_uzivatel>
    {
        String podle;
        bool vzestupne = true;

          // konstruktor s urcenim, podle ceho radit
        public uzivatel_comparer(String podle)
        {
              // osetreni sestupneho trizeni
            if (podle.EndsWith(" DESC"))
            {
                this.podle = podle.Substring(0, podle.Length - 5);
                vzestupne = false;
            } else
            {
                this.podle = podle;
            }
        }

          // porovna dva uzivatele dle parametru definovanem
          // v konstruktoru
        public int Compare(t_uzivatel x, t_uzivatel y)
        {
            t_uzivatel pom;

              // osetreni sestupneho trizeni
            if (!vzestupne)
            {
                pom = x;
                x = y;
                y = pom;
            }

            Uzivatel uzivatel1 = uzivatel.t_uzivatel_na_Uzivatel(x);
            Uzivatel uzivatel2 = uzivatel.t_uzivatel_na_Uzivatel(y);

            Adresa adresa1 = uzivatel.t_uzivatel_na_Adresa(x);
            Adresa adresa2 = uzivatel.t_uzivatel_na_Adresa(y);

            switch (podle)
            {
                case "id_uzivatel":
                    return (uzivatel1.IDUzivatel.CompareTo(uzivatel2.IDUzivatel));
                case "id_adresa":
                    return (uzivatel1.IDAdresa.CompareTo(uzivatel2.IDAdresa));
                case "login_uzivatel":
                    return (uzivatel1.LoginUzivatel.CompareTo(uzivatel2.LoginUzivatel));
                case "login_heslo_hash":
                    return (uzivatel1.LoginHesloHash.CompareTo(uzivatel2.LoginHesloHash));
                case "posledni_zmena_hesla":
                    return (uzivatel1.PosledniZmenaHesla.CompareTo(uzivatel2.PosledniZmenaHesla));
                case "jmeno":
                    return (uzivatel1.Jmeno.CompareTo(uzivatel2.Jmeno));
                case "email":
                    return (uzivatel1.Email.CompareTo(uzivatel2.Email));
                case "stav":
                    return (uzivatel1.Stav.CompareTo(uzivatel2.Stav));
                case "nazev":
                    return (adresa1.Nazev.CompareTo(adresa2.Nazev));
                case "ulice":
                    return (adresa1.Ulice.CompareTo(adresa2.Ulice));
                case "mesto":
                    return (adresa1.Mesto.CompareTo(adresa2.Mesto));
                case "psc":
                    return (adresa1.Psc.CompareTo(adresa2.Psc));
            }

            return (0);
        }
    }



    [DataObject(true)]
    public class uzivatel
    {

          // prevede data z tridy t_uzivatel na instanci tridy Uzivatel
        public static Uzivatel t_uzivatel_na_Uzivatel(t_uzivatel vstup)
        {
            return (new Uzivatel()
                        {
                            IDUzivatel = vstup.id_uzivatel,
                            IDAdresa = vstup.id_adresa,
                            LoginUzivatel = vstup.login_uzivatel,
                            LoginHesloHash = vstup.login_heslo_hash,
                            PosledniZmenaHesla = Convert.ToDateTime(vstup.posledni_zmena_hesla),
                            Jmeno = vstup.jmeno,
                            Email = vstup.email,
                            Stav = Convert.ToByte(vstup.stav)
                        }
                    );
        }

          // prevede data z tridy t_uzivatel na instanci tridy Adresa
    /**    public static Adresa t_uzivatel_na_Adresa(t_uzivatel vstup)
        {
            return (new Adresa()
                        {
                            IDAdresa = vstup.id_adresa,
                            Nazev = vstup.nazev,
                            Ulice = vstup.ulice,
                            Mesto = vstup.mesto,
                            Psc = vstup.psc
                        }
                    );
        }

        **/
        [DataObjectMethod(DataObjectMethodType.Select)]
        public List<t_uzivatel> cti(String razeni)
        {
            List<Uzivatel> uzivatele = DAOTovarna.instance.getUzivatelDAO().loadList(0, 0);
            List<t_uzivatel> vrat = new List<t_uzivatel>();

            foreach (Uzivatel uzivatel in uzivatele)
            {
                t_uzivatel pridat = new t_uzivatel();

                pridat.id_uzivatel = uzivatel.IDUzivatel;
                pridat.id_adresa = uzivatel.IDAdresa;

                pridat.login_uzivatel = uzivatel.LoginUzivatel;
                pridat.login_heslo_hash = uzivatel.LoginHesloHash;
                pridat.posledni_zmena_hesla = uzivatel.PosledniZmenaHesla.ToString();
                pridat.jmeno = uzivatel.Jmeno;
                pridat.email = uzivatel.Email;
                pridat.stav = uzivatel.Stav;

                  // zjisteni souvisejich dat z tabulky adresa pres cizi klic id_adresa
                Adresa adresa = uzivatel.Adresa_rel;

                pridat.nazev = adresa.Nazev;
                pridat.ulice = adresa.Ulice;
                pridat.mesto = adresa.Mesto;
                pridat.psc = adresa.Psc;

                vrat.Add(pridat);
            }

              // seradime
            vrat.Sort(new uzivatel_comparer(razeni));

            return(vrat);
        }

        [DataObjectMethod(DataObjectMethodType.Insert)]
        public void vloz(t_uzivatel data)
        {
            Adresa adresa = t_uzivatel_na_Adresa(data);
            Uzivatel uzivatel = t_uzivatel_na_Uzivatel(data);

            uzivatel.PosledniZmenaHesla = DateTime.Now;

            DAOTovarna.instance.getUzivatelDAO().create(adresa, uzivatel);
        }

        [DataObjectMethod(DataObjectMethodType.Delete)]
        public void smaz(t_uzivatel data)
        {
            DAOTovarna.instance.getUzivatelDAO().delete(t_uzivatel_na_Uzivatel(data));
        }

        [DataObjectMethod(DataObjectMethodType.Update)]
        public void aktualizuj(t_uzivatel data)
        {
            Adresa adresa = t_uzivatel_na_Adresa(data);
            Uzivatel uzivatel = t_uzivatel_na_Uzivatel(data);

            DAOTovarna.instance.getAdresaDAO().update(adresa);
            DAOTovarna.instance.getUzivatelDAO().update(uzivatel);
        }
    }
}
